﻿using System;
using System.Xml;
using System.Xml.Serialization;
using System.Messaging;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Configuration;
using System.Reflection;
using System.ServiceModel;
using System.Security;
using System.Security.Permissions;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Caching;
using System.Web.SessionState;
using System.Diagnostics;
using System.Threading;
using System.Runtime;
using System.Runtime.Serialization;
using System.Runtime.InteropServices;

using PickGold;
using PickGold.Security;
using PickGold.Generic;
using PickGold.Handler;
using PickGold.Attributes;
using PickGold.Util;
using PickGold.Util.Proxies;

namespace PickGold.Web.Modules
{
	[AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
	[AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
	public class SessionStateStoreProvider : SessionStateStoreProviderBase, ISessionIDManager
	{
		/// <summary>
		/// 初始化 System.Web.SessionState.SessionStateStoreProviderBase 类的新实例。
		/// </summary>
		public SessionStateStoreProvider()
		{
		}

		/// <summary>
		/// 创建要用于当前请求的新 System.Web.SessionState.SessionStateStoreData 对象。
		/// </summary>
		/// <param name="context">当前请求的 System.Web.HttpContext。</param>
		/// <param name="timeout">新 System.Web.SessionState.SessionStateStoreData 的会话状态 System.Web.SessionState.HttpSessionState.Timeout 值。</param>
		/// <returns>当前请求的新 System.Web.SessionState.SessionStateStoreData。</returns>
		public override SessionStateStoreData CreateNewStoreData(HttpContext context, int timeout)
		{
			return null;
		}

		/// <summary>
		/// 将新的会话状态项添加到数据存储区中。
		/// </summary>
		/// <param name="context">当前请求的 System.Web.HttpContext。</param>
		/// <param name="id">当前请求的 System.Web.SessionState.HttpSessionState.SessionID。</param>
		/// <param name="timeout">当前请求的会话 System.Web.SessionState.HttpSessionState.Timeout。</param>
		public override void CreateUninitializedItem(HttpContext context, string id, int timeout)
		{
		}

		/// <summary>
		/// 释放由 System.Web.SessionState.SessionStateStoreProviderBase 实现使用的所有资源。
		/// </summary>
		public override void Dispose()
		{
		}

		/// <summary>
		/// 在请求结束时由 System.Web.SessionState.SessionStateModule 对象调用。
		/// </summary>
		/// <param name="context">当前请求的 System.Web.HttpContext。</param>
		public override void EndRequest(HttpContext context)
		{
		}

		/// <summary>
		/// 从会话数据存储区中返回只读会话状态数据。
		/// </summary>
		/// <param name="context">当前请求的 System.Web.HttpContext。</param>
		/// <param name="id">当前请求的 System.Web.SessionState.HttpSessionState.SessionID。</param>
		/// <param name="locked">当此方法返回时，如果请求的会话项在会话数据存储区被锁定，请包含一个设置为 true 的布尔值；否则请包含一个设置为 false 的布尔值。</param>
		/// <param name="lockAge">当此方法返回时，请包含一个设置为会话数据存储区中的项锁定时间的 System.TimeSpan 对象。</param>
		/// <param name="lockId">当此方法返回时，请包含一个设置为当前请求的锁定标识符的对象。有关锁定标识符的详细信息，请参见 System.Web.SessionState.SessionStateStoreProviderBase 类摘要中的“锁定会话存储区数据”。</param>
		/// <param name="actions">当此方法返回时，请包含 System.Web.SessionState.SessionStateActions 值之一，指示当前会话是否为未初始化的无 Cookie 会话。</param>
		/// <returns>使用会话数据存储区中的会话值和信息填充的 System.Web.SessionState.SessionStateStoreData。</returns>
		public override SessionStateStoreData GetItem(HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions)
		{
			locked = false;
			lockAge = TimeSpan.Zero;
			lockId = null;
			actions = SessionStateActions.None;
			return null;
		}

		/// <summary>
		/// 从会话数据存储区中返回只读会话状态数据。
		/// </summary>
		/// <param name="context">当前请求的 System.Web.HttpContext。</param>
		/// <param name="id">当前请求的 System.Web.SessionState.HttpSessionState.SessionID。</param>
		/// <param name="locked">当此方法返回时，如果成功获得锁定，请包含一个设置为 true 的布尔值；否则请包含一个设置为 false 的布尔值。</param>
		/// <param name="lockAge">当此方法返回时，请包含一个设置为会话数据存储区中的项锁定时间的 System.TimeSpan 对象。</param>
		/// <param name="lockId">当此方法返回时，请包含一个设置为当前请求的锁定标识符的对象。有关锁定标识符的详细信息，请参见 System.Web.SessionState.SessionStateStoreProviderBase 类摘要中的“锁定会话存储区数据”。</param>
		/// <param name="actions">当此方法返回时，请包含 System.Web.SessionState.SessionStateActions 值之一，指示当前会话是否为未初始化的无 Cookie 会话。</param>
		/// <returns>使用会话数据存储区中的会话值和信息填充的 System.Web.SessionState.SessionStateStoreData。</returns>
		public override SessionStateStoreData GetItemExclusive(HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions)
		{
			locked = false;
			lockAge = TimeSpan.Zero;
			lockId = null;
			actions = SessionStateActions.None;
			return null;
		}

		/// <summary>
		/// 由 System.Web.SessionState.SessionStateModule 对象调用，以便进行每次请求初始化。
		/// </summary>
		/// <param name="context">当前请求的 System.Web.HttpContext。</param>
		public override void InitializeRequest(HttpContext context)
		{
		}

		/// <summary>
		/// 释放对会话数据存储区中项的锁定。
		/// </summary>
		/// <param name="context">当前请求的 System.Web.HttpContext。</param>
		/// <param name="id">当前请求的会话标识符。</param>
		/// <param name="lockId">当前请求的锁定标识符。</param>
		public override void ReleaseItemExclusive(HttpContext context, string id, object lockId)
		{
		}

		/// <summary>
		/// 删除会话数据存储区中的项数据。
		/// </summary>
		/// <param name="context">当前请求的 System.Web.HttpContext。</param>
		/// <param name="id">当前请求的会话标识符。</param>
		/// <param name="lockId">当前请求的锁定标识符。</param>
		/// <param name="item">表示将从数据存储区中删除的项的 System.Web.SessionState.SessionStateStoreData。</param>
		public override void RemoveItem(HttpContext context, string id, object lockId, SessionStateStoreData item)
		{
		}

		/// <summary>
		/// 更新会话数据存储区中的项的到期日期和时间。
		/// </summary>
		/// <param name="context">当前请求的 System.Web.HttpContext。</param>
		/// <param name="id">当前请求的会话标识符。</param>
		public override void ResetItemTimeout(HttpContext context, string id)
		{
		}

		/// <summary>
		/// 使用当前请求中的值更新会话状态数据存储区中的会话项信息，并清除对数据的锁定。
		/// </summary>
		/// <param name="context">当前请求的 System.Web.HttpContext。</param>
		/// <param name="id">当前请求的会话标识符。</param>
		/// <param name="item">包含要存储的当前会话值的 System.Web.SessionState.SessionStateStoreData 对象。</param>
		/// <param name="lockId">当前请求的锁定标识符。</param>
		/// <param name="newItem">如果为 true，则将会话项标识为新项；如果为 false，则将会话项标识为现有的项。</param>
		public override void SetAndReleaseItemExclusive(HttpContext context, string id, SessionStateStoreData item, object lockId, bool newItem)
		{
		}

		/// <summary>
		/// 设置对 Global.asax 文件中定义的 Session_OnEnd 事件的 System.Web.SessionState.SessionStateItemExpireCallback 委托的引用。
		/// </summary>
		/// <param name="expireCallback">对 Global.asax 文件中定义的 Session_OnEnd 事件的 System.Web.SessionState.SessionStateItemExpireCallback 委托。</param>
		/// <returns>如果会话状态存储提供程序支持调用 Session_OnEnd 事件，则为 true；否则为 false。</returns>
		public override bool SetItemExpireCallback(SessionStateItemExpireCallback expireCallback)
		{
			return false;
		}

		#region ISessionIDManager 成员

		public string CreateSessionID(HttpContext context)
		{
			return Guid.NewGuid().ToString("N");
		}

		public string GetSessionID(HttpContext context)
		{
			return null;
		}

		public void Initialize()
		{
		}

		public bool InitializeRequest(HttpContext context, bool suppressAutoDetectRedirect, out bool supportSessionIDReissue)
		{
			supportSessionIDReissue = false;
			return false;
		}

		public void RemoveSessionID(HttpContext context)
		{
		}

		public void SaveSessionID(HttpContext context, string id, out bool redirected, out bool cookieAdded)
		{
			redirected = true;
			cookieAdded = true;
		}

		public bool Validate(string id)
		{
			return false;
		}

		#endregion
	}

	public class SessionStateStore
	{
		public object GetItem(string applicationId, string sessionId, string itemId)
		{
			return null;
		}

		public void SetItem(string applicationId, string sessionId, string itemId, object value)
		{
		}

		public void Remove(string applicationId, string sessionId, string itemId)
		{
		}
	}

	public class SessionStateStoreContent
	{
		/// <summary>
		/// 当前会话的会话变量和值。
		/// </summary>
		public SessionStateItemCollection Items;

		/// <summary>
		/// 获取并设置在会话状态提供程序终止会话之前各请求之间所允许的时间（以分钟为单位）。
		/// </summary>
		public int Timeout;

		public bool Locked
		{
			get
			{
				if (this.LockId == null)
					return false;

				return true;
			}
		}

		public object LockId;

		public TimeSpan LockAge;

		public SessionStateActions Actions;
	}
}
